package com.example.ad.sdk.domain.view

import android.view.View
import androidx.viewbinding.ViewBinding
import com.example.ad.sdk.domain.extensions.inflateBindingWithGeneric

/**
 * BaseBingActivity 是一个抽象基类，基于 MVVM/MVI 架构设计，结合 ViewBinding 提供了更简洁的视图绑定方式。
 * 它继承自 [BaseActivity]，并扩展了 ViewBinding 的功能，适用于所有需要使用  MVVM/MVI  架构和 ViewBinding 的 Activity 场景。
 *
 * ### 主要功能
 * 1. **ViewBinding 支持**：通过 [inflateBindingWithGeneric] 方法动态创建 ViewBinding 实例，避免手动 findViewById 操作。
 * 2. **布局加载**：重写了 [layoutId] 和 [initDataBind] 方法，使用 ViewBinding 替代传统的布局资源 ID 加载方式。
 * 3. **简化视图操作**：通过 [mBinding] 属性提供对 ViewBinding 的直接访问，方便在子类中操作视图组件。
 *
 * ### 关键属性
 * - [_binding]: 私有属性，存储当前 Activity 的 ViewBinding 实例。
 * - [mBinding]: 公开只读属性，用于在子类中访问 ViewBinding 实例。
 *
 * ### 生命周期方法
 * - [layoutId]: 返回值固定为 0，表示不使用传统的布局资源 ID 加载方式。
 * - [initDataBind]: 创建并初始化 ViewBinding 实例，并返回其根视图以设置内容视图。
 *
 * ### 使用场景
 * - 适用于所有需要继承 Activity 并使用  MVVM/MVI  架构和 ViewBinding 的模块化开发场景。
 * - 提供了统一的 ViewBinding 初始化逻辑，减少重复代码。
 *
 */
abstract class BaseBingActivity <VB : ViewBinding> : BaseActivity() {

    // ViewBinding实例，使用延迟初始化
    private lateinit var _binding: VB

    /**
     * 通过lazy委托获取ViewBinding实例，确保在首次访问时才进行初始化。
     */
    val vb by lazy { _binding }

    override fun layoutId(): Int = 0

    /**
     * 创建viewBinding
     */
    override fun initDataBind(): View {
        _binding = inflateBindingWithGeneric(layoutInflater)
        return _binding.root
    }
}